﻿using System.Collections.Generic;

namespace DimensionsHelper.Common.Contracts.Metadata;

public interface IMetadataDocumentInfo
{
    /// <summary>
    ///     MDM文档使用的命名空间定义。
    /// </summary>
    string XmlNamespace { get; }

    /// <summary>
    ///     创建当前文档时的版本号。
    /// </summary>
    string CreateVersion { get; }

    /// <summary>
    ///     最近一次保存时使用的版本号。
    /// </summary>
    string LastVersion { get; }

    /// <summary>
    ///     是否使用 Quatumn 变量定义。
    /// </summary>
    bool SystemVariable { get; }

    /// <summary>
    ///     数据使用版本。
    /// </summary>
    int DataVersion { get; }

    /// <summary>
    ///     数据使用的下级版本。
    /// </summary>
    int? DataSubVersion { get; }
}


/// <summary>
///     存储Metadata元数据文档中 design Tag下的内容。
/// </summary>
public interface IMetadataDocumentDesign
{
    /// <summary>
    ///     多层数据的全局属性。
    /// </summary>
    IProperties Properties { get; }

    /// <summary>
    ///     设计脚本中出示的字段定义。
    /// </summary>
    IFields Fields { get; }

    /// <summary>
    ///     设计脚本中出示的元素列表定义。
    /// </summary>
    IMetadataTypes Types { get; }

    /// <summary>
    ///     设计脚本中的页面定义。
    /// </summary>
    IPages Pages { get; }

    /// <summary>
    ///     设计脚本使用的变量路由定义。
    /// </summary>
    IRoutings Routings { get; }
}


/// <summary>
///     Metadata元数据文档对象，可以读取.mdd扩展名的XML文档。
/// </summary>
public interface IMetadataDocument : IMetadataDocumentInfo, IMetadataLabeledObject
{
    /// <summary>
    ///     获取数据使用的下级版本。
    /// </summary>
    new int DataSubVersion { get; }

    /// <summary>
    ///     获取检查 db 类型字段筛选器的有效性。
    /// </summary>
    bool DbFilterValidation { get; }

    /// <summary>
    ///     获取文档使用的数据链接设置集合。
    /// </summary>
    IDataSources DataSources { get; }

    /// <summary>
    ///     获取文档的变量集合。
    /// </summary>
    IVariables Variables { get; }

    /// <summary>
    ///     文档的页面变量集合。
    /// </summary>
    IPages Pages { get; }

    /// <summary>
    ///     元数据文档出示在脚本中的字段、分类列表和页面定义。
    /// </summary>
    IMetadataDocumentDesign Design { get; }

    /// <summary>
    ///     获取文档的变量实例集合。
    /// </summary>
    IVariableInstances Mapping { get; }

    /// <summary>
    ///     获取文档的语言配置。
    /// </summary>
    ILanguages Languages { get; }

    /// <summary>
    ///     获取文档的上下文配置。
    /// </summary>
    IContexts Contexts { get; }

    /// <summary>
    ///     获取文档的标签类型上下文配置。
    /// </summary>
    IContexts LabelTypes { get; }

    /// <summary>
    ///     获取文档的路由上下文配置。
    /// </summary>
    IContexts RoutingContexts { get; }

    /// <summary>
    ///     获取文档的脚本上下文配置。
    /// </summary>
    IContexts ScriptContexts { get; }

    /// <summary>
    ///     获取文档的字符串元素集合。
    /// </summary>
    IList<string> Atoms { get; }

    /// <summary>
    ///     获取文档的分类元素"名称-值"对照表。
    /// </summary>
    ICategoryMap CategoryMap { get; }

    /// <summary>
    ///     获取文档的版本列表。
    /// </summary>
    IVersionList VersionList { get; }

    /// <summary>
    ///     获取文档的保存记录。
    /// </summary>
    ISaveLogs SaveLogs { get; }

    /// <summary>
    ///     获取文档内的类型定义集合。
    /// </summary>
    IMetadataTypes Types { get; }

    /// <summary>
    ///     获取文档内的字段定义集合。此集合包含系统变量。
    /// </summary>
    IFields Fields { get; }

    /// <summary>
    ///     获取MDM文档的路由设置。
    /// </summary>
    IRoutings Routings { get; }

    /// <summary>
    ///     文档的当前全局上下文类型。
    /// </summary>
    string Context { get; set; }

    /// <summary>
    ///     获取或设置全局的语言名。
    /// </summary>
    string Language { get; set; }

    /// <summary>
    ///     获取或设置全局的标签类型。
    /// </summary>
    string LabelType { get; set; }

    /// <summary>
    ///     打开指定文档，并解析XML内容。
    /// </summary>
    /// <param name="fileName">指定文件路径</param>
    void Open(string fileName);

    /// <summary>
    ///     关闭文档并释放已读取内容。
    /// </summary>
    void Close();

    /// <summary>
    ///     创建一个普通变量，并添加到<see cref="Variables" />中。
    /// </summary>
    /// <param name="name">变量名</param>
    /// <param name="dataType">变量数据类型</param>
    /// <returns>新创建的变量对象</returns>
    IVariable CreateVariable(string name, FieldDataType dataType);

    /// <summary>
    ///     创建一个普通变量，并添加到<see cref="Variables" />、<see cref="IMetadataDocumentDesign.Fields" />和<see cref="Fields" />中。
    /// </summary>
    /// <param name="name">变量名</param>
    /// <param name="dataType">变量数据类型</param>
    /// <returns>新创建的变量对象</returns>
    IVariable CreateField(string name, FieldDataType dataType);

    /// <summary>
    ///     创建一个循环变量，并添加到<see cref="IMetadataDocumentDesign.Fields" />和<see cref="Fields" />中。
    /// </summary>
    /// <param name="name">对象名</param>
    /// <param name="iteratorType">变量迭代类型</param>
    /// <returns>新创建的循环变量</returns>
    IArray CreateArray(string name, IteratorTypes iteratorType);

    /// <summary>
    ///     创建一个复合变量。
    /// </summary>
    /// <param name="name">变量名</param>
    /// <returns>新创建的复合变量</returns>
    ICompound CreateCompound(string name);

    /// <summary>
    ///     创建一个新的块状变量，并添加到<see cref="IMetadataDocumentDesign.Fields" />和<see cref="Fields" />中。
    /// </summary>
    /// <param name="name">变量名</param>
    /// <returns>新创建的块状变量</returns>
    IBlock CreateBlock(string name);

    /// <summary>
    ///     创建一个新的页面字段，并添加到<see cref="Pages" />中。
    /// </summary>
    /// <param name="name">页面定义名称</param>
    /// <returns>新创建的页面定义</returns>
    IPage CreatePage(string name);

    /// <summary>
    ///     创建一个新的分类元素列表，并添加到<see cref="IMetadataDocumentDesign.Types" />和<see cref="Types" />中。
    /// </summary>
    /// <param name="name">分类列表名</param>
    /// <returns>新创建的分类列表名称</returns>
    IElementList CreateElementList(string name);
}